package de.sonnemann_it.helden_software.heldenbogen.originalpdf;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Properties;


public class Communicator {

    private PrintWriter toHelden;
    private BufferedReader fromHelden;
    private StringBuffer buffer;
    private char[] readbuffer;

    public Communicator() {
        // Port aus der Properties-Datei lesen
        Properties prop = new Properties();
        try {
            File properties = new File(System.getProperty("user.home")
                    + System.getProperty("file.separator") + ".dsa4.properties");
            FileInputStream fis = new FileInputStream(properties);
            prop.load(fis);
            fis.close();
        } catch (Exception e) {
            System.out.println("Fehler beim Zugriff auf die Properties-Datei");
            System.out.println(e.toString());
            System.exit(1);
        }
        // TCP/IP Verbindung zum Port öffnen
        Socket clientSocket;
        try {
            clientSocket = new Socket("localhost", 
                                Integer.parseInt(prop.get("helden4_1.plugintcpip").toString()));
            toHelden = new PrintWriter(clientSocket.getOutputStream(),true);
            fromHelden  = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        } catch (Exception e) {
            System.out.println("Fehler bei der Verbindung zu Port " 
                                        + prop.get("helden4_1.plugintcpip"));
            System.out.println(e.toString());
            System.exit(1);
        }
        buffer = new StringBuffer();
        readbuffer = new char[1024];
    }

    /**
     * Wartet auf eine Antwort von Helden-Software
     * @return Antwort von Helden-Software
     */
    public String getNaechsteAntwort() {
        String s = null;
        try {
            while (true) {
                int n;
                // Neue Daten abholen, falls verfügbar
                while (fromHelden.ready() && (n = fromHelden.read(readbuffer)) != -1) {
                        buffer.append(readbuffer, 0, n);
                }
                
                // Nach fertigen Nachrichten suchen und diese ggf. zurückgeben
                int pos = buffer.indexOf("\0"); 
                if (pos > 0) {
                    s = buffer.substring(0, pos);                   
                    buffer = buffer.delete(0, pos + 1);                    
                    return s;
                }
                // Sonst warten wir halt eine halbe Sekunde
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                }
            }
        } catch (IOException e) {
            System.out.println("Fehler beim Lesen der Daten von Helden");
            e.printStackTrace();
        }
        return null;
    }

    public void sendeAnfrage(String string) {
        toHelden.write(string + "\0\n");
        toHelden.flush();
    }
    
    
    
    
}
